/**
 * Created by Administrator on 2017/8/4.
 */
import cn.edu.hfut.dmic.webcollector.crawldb.DBManager;
import cn.edu.hfut.dmic.webcollector.fetcher.Executor;
import cn.edu.hfut.dmic.webcollector.model.CrawlDatum;
import cn.edu.hfut.dmic.webcollector.model.CrawlDatums;
import cn.edu.hfut.dmic.webcollector.model.Page;
import cn.edu.hfut.dmic.webcollector.plugin.berkeley.BerkeleyDBManager;
import cn.edu.hfut.dmic.webcollector.plugin.ram.RamCrawler;
import common.config.AbuyunDynamicProxyRequester;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.htmlunit.HtmlUnitDriver;
import org.springframework.jdbc.core.JdbcTemplate;



public class PanLiCrawler  extends RamCrawler{
    /**
     *
     * WebCollector 2.40新特性 page.matchType
     * 在添加CrawlDatum时（添加种子、或在抓取时向next中添加任务），
     * 可以为CrawlDatum设置type信息
     *
     * type的本质也是meta信息，为CrawlDatum的附加信息
     * 在添加种子或向next中添加任务时，设置type信息可以简化爬虫的开发
     *
     * 例如在处理列表页时，爬虫解析出内容页的链接，在将内容页链接作为后续任务
     * 将next中添加时，可设置其type信息为content（可自定义），在后续抓取中，
     * 通过page.matchType("content")就可判断正在解析的页面是否为内容页
     *
     * 设置type的方法主要有3种：
     * 1）添加种子时，addSeed(url,type)
     * 2）向next中添加后续任务时：next.add(url,type)或next.add(links,type)
     * 3）在定义CrawlDatum时：crawlDatum.type(type)
     *
     * @author hu
     */
        static JdbcTemplate jdbcTemplate = null;
        /*
            该教程是DemoMetaCrawler的简化版

            该Demo爬虫需要应对豆瓣图书的三种页面：
            1）标签页（taglist，包含图书列表页的入口链接）
            2）列表页（booklist，包含图书详情页的入口链接）
            3）图书详情页（content）

            另一种常用的遍历方法可参考TutorialCrawler
         */
        public void visit(Page page, CrawlDatums next) {
            System.out.println(page.html());
            if (page.matchType( "resultList" )){
                next.add(page.links("div[class=wstitle] a"),"content");
            }if (page.matchType( "content" )){
                String title=page.select("div[ud=contentTitle]").first().text();
                System.out.println("title:"+title);
            }
        }
        public static void main(String[] args) throws Exception {
            Executor executor=new Executor() {
          //      @Override
                public void execute(CrawlDatum datum, CrawlDatums next) throws Exception {
                    HtmlUnitDriver driver = new HtmlUnitDriver();
                    driver.setJavascriptEnabled(true);
                    driver.get(datum.url());
                    WebElement element=driver.findElementByCssSelector("span#outlink1");
                    System.out.println("反链数:"+element.getText());
                }
            };

            //创建一个基于伯克利DB的DBManager
            DBManager manager=new BerkeleyDBManager("crawl");


            PanLiCrawler crawler = new PanLiCrawler();
            crawler.setDBManager( manager );
            crawler.setExecutor( executor );
            crawler.setRequester(new AbuyunDynamicProxyRequester("HJPC687W1I2E99HD", "8F9AAB9926EEE9AC"));
            crawler.addSeed("http://wenshu.court.gov.cn/list/list/?sorttype=1&conditions=searchWord+QWJS+++全文检索:强迫劳动","resultList");
        /*可以设置每个线程visit的间隔，这里是毫秒*/
            //crawler.setVisitInterval(1000);
             crawler.setExecuteInterval(100000);
        /*可以设置http请求重试的间隔，这里是毫秒*/
            //crawler.setRetryInterval(1000);
            crawler.setThreads(1);
            crawler.start(2);
        }
}
